module(..., package.seeall) -- 使得文件中的函数在何处都可调用
require "lbsLoc"
require "misc"
require "mqttOutMsgKeson"
require "nvm"
-- 初始化nvm获取配置参数
nvm.init("config.lua", true)
--[[
功能  ：发送查询位置请求
参数  ：无
返回值：无
]]
Lat, Lng = 0.00, 0.00
InstallTime = false
-- 小数取整：4舍五入
local function decimalToInit(decimalGet)
    local initRetur, decimalRetur
    if decimalGet >= 0 then
        initRetur, decimalRetur = math.modf(decimalGet)
        if decimalRetur >= 0.5 then initRetur = initRetur + 1 end
    else
        initRetur = 0
    end
    return initRetur
end
-- 计算设备位置间距
local function algorithm(lat1, lon1, lat2, lon2)
    local r = 6371
    local deltaLat = math.rad((lat2 - lat1) / 180)
    local deltaLon = math.rad((lon2 - lon1) / 180)
    lat1 = math.rad(lat1 / 180)
    lat2 = math.rad(lat2 / 180)

    local a = math.sin(deltaLat / 2) ^ 2 + math.cos(lat1) * math.cos(lat2) *
                  math.sin(deltaLon / 2) ^ 2
    local c = 2 * math.atan2(math.sqrt(a),math.sqrt(1-a))
    local distance = r * c
    return distance
end
--[[ -- 获取系统时间
function GetSystemTime()
    local tClock, nowDate, nowDateMill = os.date("*t"), "", ""
    local currentTime = os.clock() * 1000
    local milliseconds = math.floor(currentTime % 1000)
    nowDate = string.format("%04d-%02d-%02d %02d:%02d:%02d", tClock.year,
                            tClock.month, tClock.day, tClock.hour, tClock.min,
                            tClock.sec)
    nowDateMill = nowDate .. "." .. milliseconds
    return nowDate, nowDateMill
end ]]
--[[
功能  ：获取基站对应的经纬度后的回调函数
参数  ：
        result：number类型，0表示成功，1表示网络环境尚未就绪，2表示连接服务器失败，3表示发送数据失败，4表示接收服务器应答超时，5表示服务器返回查询失败；为0时，后面的5个参数才有意义
        lat：string类型，纬度，整数部分3位，小数部分7位，例如031.2425864
        lng：string类型，经度，整数部分3位，小数部分7位，例如121.4736522
        addr：目前无意义
        time：string类型或者nil，服务器返回的时间，6个字节，年月日时分秒，需要转为十六进制读取
            第一个字节：年减去2000，例如2017年，则为0x11
            第二个字节：月，例如7月则为0x07，12月则为0x0C
            第三个字节：日，例如11日则为0x0B
            第四个字节：时，例如18时则为0x12
            第五个字节：分，例如59分则为0x3B
            第六个字节：秒，例如48秒则为0x30
        locType：numble类型或者nil，定位类型，0表示基站定位成功，255表示WIFI定位成功
返回值：无
]]
local clientNo, longitude, latitude = nvm.get("ClientNo"), nvm.get("Longitude"),
                                      nvm.get("Latitude")
local installDistance
local function getLocCb(result, lat, lng, addr, time, locType)
    log.info("getLbsLoc.getLocCb", result, lat, lng)
    -- 获取经纬度成功
    if result == 0 then
        log.info("服务器返回的时间", time:toHex())
        log.info("定位类型，基站定位成功返回0", locType)
        Lat, Lng = lat, lng
        log.info("基站经纬度", Lat, Lng, "已存储经纬度:", longitude,
                 latitude)
        log.info("IMEI:", misc.getImei())
        installDistance =
            decimalToInit(algorithm(longitude, latitude, lng, lat))
        log.info("installDistance:", installDistance)
        if longitude ~= lng then nvm.set("Longitude", lng) end
        if latitude ~= lat then nvm.set("Latitude", lat) end
        if installDistance >= 10 then
            InstallTime = true
        else
            InstallTime = false
        end
        -- sendPositionInfo = "admin,coord," .. Lng .. "," .. Lat
        -- mqttOutMsgKeson.insertMsgKeson(clientNo .. "/GET", sendPositionInfo, 0)
    end
end

local function reqLbsLoc() lbsLoc.request(getLocCb) end

sys.taskInit(reqLbsLoc)
